{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## FastSLAM1.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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kGDf1h133OFF+bMW0pwBtMXBbLzPJsoJbQttDO0L9n333SfYMxn3UY3P3FwrO2cAXavRNpTnu9/9rpx22mkFMdFBmku86BiixgzXsM997nOC2S3T6FICwlwzYHfWWWflWZnc1B3HDhwOPfTQEAc280Mx9M3oNoHozDBmbjALSJNMoFu3bvLlL39Z/va3vyULeR6iKxFoX9rWgATta/fdd/ecjr344BXsxZUXXnghfPGwSzO0VglQAazVmithvrGE1NplpKQZGuxtCzbwC5b3tNN9/PHHw9wizDXTFnbKQGdVXVSMtYxpdvARiDzyyCMFgwy+Phw7dmxaVO/DX3zxRTnssMO855AEAApM8BFIuLcNs+5qli9fHi6h6zXtYgJ4acceyv322684kD7OEKAC6ExVVqYgUOzwRv3Xv/41vCGUGMx09e3bVzArgeUDHFdxzjnnyPTp08PjYC666CIJvvQMwyuTy+q7C87hwsCDfTXYk/T0008LuGDfjSrK1Zfr8ucI+yLHjRsXHuUBNnPmzAnb1/nnn1/+m9fQHXBe5OjRo8P9tThiCR8TBV/Vi++ccJzLyy+/nK9J7B1Fn4RnDM/VhRdeGLLC8S/YPwlu+OAh+Oo1H8cHR5QTZo5xHmL37t3Dfnnq1Kn59oUZUuxPhvKM/onGYQLuf+jMEpaSAI4LCB6Hor9ly5blb4MjYHCkAI5+wV/0mI+8oEeOhoaGXH19fXh0DvjpUSe+H42DJoAjOcADXMDIbEseNRFrUfHc4dglMMLRJqeeemou2KNljeNDYPAVeVFfBEbgpQZH6IAZ/HHskI/c0jgFZwDmGYEV+JlHeSlL2m4RqENxggeDhgRIgARIgARIgARIwBMC/ArYk4pmMUmABEiABEiABEhACVABVBK0SYAESIAESIAESMATAlQAPaloFpMESIAESIAESIAElAAVQCVBmwRIgARIgARIgAQ8IUAF0JOKZjFJgARIgARIgARIQAlQAVQStEmABEiABEiABEjAEwJUAD2paBaTBEiABEiABEiABJQAFUAlQZsESIAESIAESIAEPCFABdCTimYxSYAESIAESIAESEAJUAFUErRJgARIgARIgARIwBMCVAA9qWgWkwRIgARIgARIgASUABVAJUGbBEiABEiABEiABDwhQAXQk4pmMUmABEiABEiABEhACVABVBK0SYAESIAESIAESMATAlQAPaloFpMESIAESIAESIAElAAVQCVBmwRIgARIgARIgAQ8IUAF0JOKZjFJgARIgARIgARIQAlQAVQStEmABEiABEiABEjAEwJUAD2paBaTBEiABEiABEiABJQAFUAlQZsESIAESIAESIAEPCFABdCTimYxSYAESIAESIAESEAJUAFUErRJgARIgARIgARIwBMCVAA9qWgWkwRIgARIgARIgASUABVAJUGbBEiABEiABEiABDwhQAXQk4pmMUmABEiABEiABEhACVABVBK0SYAESIAESIAESMATAlQAPaloFpMESIAESIAESIAElAAVQCVBmwRIgARIgARIgAQ8IUAF0JOKZjFJgARIgARIgARIQAlQAVQStEmABEiABEiABEjAEwJUAD2paBaTBEiABEiABEiABJTA/weNuvp7tqnQggAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 1,
     "metadata": {
      "image/png": {
       "width": 600
      }
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import Image\n",
    "Image(filename=\"animation.png\",width=600)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Simulation\n",
    "\n",
    "This is a feature based SLAM example using FastSLAM 1.0.\n",
    "\n",
    "The blue line is ground truth, the black line is dead reckoning, the red\n",
    "line is the estimated trajectory with FastSLAM.\n",
    "\n",
    "The red points are particles of FastSLAM.\n",
    "\n",
    "Black points are landmarks, blue crosses are estimated landmark\n",
    "positions by FastSLAM.\n",
    "\n",
    "\n",
    "![gif](https://github.com/AtsushiSakai/PythonRoboticsGifs/raw/master/SLAM/FastSLAM1/animation.gif)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Introduction\n",
    "\n",
    "FastSLAM algorithm implementation is based on particle filters and belongs to the family of probabilistic SLAM approaches. It is used with feature-based maps (see gif above) or  with occupancy grid maps.\n",
    "\n",
    "As it is shown, the particle filter differs from EKF by representing the robot's estimation through a set of particles. Each single particle has an independent belief, as it holds the pose $(x, y, \\theta)$ and an array of landmark locations $[(x_1, y_1), (x_2, y_2), ... (x_n, y_n)]$ for n landmarks.\n",
    "\n",
    "* The blue line is the true trajectory\n",
    "* The red line is the estimated trajectory\n",
    "* The red dots represent the distribution of particles\n",
    "* The black line represent dead reckoning tracjectory\n",
    "* The blue x is the observed and estimated landmarks\n",
    "* The black x is the true landmark\n",
    "\n",
    "I.e. Each particle maintains a deterministic pose and n-EKFs for each landmark and update it with each measurement."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Algorithm walkthrough\n",
    "\n",
    "The particles are initially drawn from a uniform distribution the represent the initial uncertainty.\n",
    "At each time step we do:\n",
    "\n",
    "* Predict the pose for each particle by using $u$ and the motion model (the landmarks are not updated). \n",
    "* Update the particles with observations $z$, where the weights are adjusted based on how likely the particle to have the correct pose given the sensor measurement\n",
    "* Resampling such that the particles with the largest weights survive and the unlikely ones with the lowest weights die out.\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1- Predict\n",
    "The following equations and code snippets we can see how the particles distribution evolves in case we provide only the control $(v,w)$, which are the linear and angular velocity respectively. \n",
    "\n",
    "$\\begin{equation*}\n",
    "F=\n",
    "\\begin{bmatrix}\n",
    "1 & 0 & 0 \\\\\n",
    "0 & 1 & 0 \\\\\n",
    "0 & 0 & 1 \n",
    "\\end{bmatrix}\n",
    "\\end{equation*}$\n",
    "\n",
    "$\\begin{equation*}\n",
    "B=\n",
    "\\begin{bmatrix}\n",
    "\\Delta t cos(\\theta) & 0\\\\\n",
    "\\Delta t sin(\\theta) & 0\\\\\n",
    "0 & \\Delta t\n",
    "\\end{bmatrix}\n",
    "\\end{equation*}$\n",
    "\n",
    "$\\begin{equation*}\n",
    "X = FX + BU \n",
    "\\end{equation*}$\n",
    "\n",
    "\n",
    "$\\begin{equation*}\n",
    "\\begin{bmatrix}\n",
    "x_{t+1} \\\\\n",
    "y_{t+1} \\\\\n",
    "\\theta_{t+1}\n",
    "\\end{bmatrix}=\n",
    "\\begin{bmatrix}\n",
    "1 & 0 & 0 \\\\\n",
    "0 & 1 & 0 \\\\\n",
    "0 & 0 & 1 \n",
    "\\end{bmatrix}\\begin{bmatrix}\n",
    "x_{t} \\\\\n",
    "y_{t} \\\\\n",
    "\\theta_{t}\n",
    "\\end{bmatrix}+\n",
    "\\begin{bmatrix}\n",
    "\\Delta t cos(\\theta) & 0\\\\\n",
    "\\Delta t sin(\\theta) & 0\\\\\n",
    "0 & \\Delta t\n",
    "\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "v_{t} + \\sigma_v\\\\\n",
    "w_{t} + \\sigma_w\\\\\n",
    "\\end{bmatrix}\n",
    "\\end{equation*}$\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The following snippets playsback the recorded trajectory of each particle.\n",
    "\n",
    "To get the insight of the motion model change the value of $R$ and re-run the cells again. As R is the parameters that indicates how much we trust that the robot executed the motion commands.\n",
    "\n",
    "It is interesting to notice also that only motion will increase the uncertainty in the system as the particles start to spread out more. If observations are included the uncertainty will decrease and particles will converge to the correct estimate."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# CODE SNIPPET #\n",
    "import numpy as np\n",
    "import math\n",
    "from copy import deepcopy\n",
    "# Fast SLAM covariance\n",
    "Q = np.diag([3.0, np.deg2rad(10.0)])**2\n",
    "R = np.diag([1.0, np.deg2rad(20.0)])**2\n",
    "\n",
    "#  Simulation parameter\n",
    "Qsim = np.diag([0.3, np.deg2rad(2.0)])**2\n",
    "Rsim = np.diag([0.5, np.deg2rad(10.0)])**2\n",
    "OFFSET_YAWRATE_NOISE = 0.01\n",
    "\n",
    "DT = 0.1  # time tick [s]\n",
    "SIM_TIME = 50.0  # simulation time [s]\n",
    "MAX_RANGE = 20.0  # maximum observation range\n",
    "M_DIST_TH = 2.0  # Threshold of Mahalanobis distance for data association.\n",
    "STATE_SIZE = 3  # State size [x,y,yaw]\n",
    "LM_SIZE = 2  # LM srate size [x,y]\n",
    "N_PARTICLE = 100  # number of particle\n",
    "NTH = N_PARTICLE / 1.5  # Number of particle for re-sampling\n",
    "\n",
    "class Particle:\n",
    "\n",
    "    def __init__(self, N_LM):\n",
    "        self.w = 1.0 / N_PARTICLE\n",
    "        self.x = 0.0\n",
    "        self.y = 0.0\n",
    "        self.yaw = 0.0\n",
    "        # landmark x-y positions\n",
    "        self.lm = np.zeros((N_LM, LM_SIZE))\n",
    "        # landmark position covariance\n",
    "        self.lmP = np.zeros((N_LM * LM_SIZE, LM_SIZE))\n",
    "\n",
    "def motion_model(x, u):\n",
    "    F = np.array([[1.0, 0, 0],\n",
    "                  [0, 1.0, 0],\n",
    "                  [0, 0, 1.0]])\n",
    "\n",
    "    B = np.array([[DT * math.cos(x[2, 0]), 0],\n",
    "                  [DT * math.sin(x[2, 0]), 0],\n",
    "                  [0.0, DT]])\n",
    "    x = F @ x + B @ u\n",
    "        \n",
    "    x[2, 0] = pi_2_pi(x[2, 0])\n",
    "    return x\n",
    "    \n",
    "def predict_particles(particles, u):\n",
    "    for i in range(N_PARTICLE):\n",
    "        px = np.zeros((STATE_SIZE, 1))\n",
    "        px[0, 0] = particles[i].x\n",
    "        px[1, 0] = particles[i].y\n",
    "        px[2, 0] = particles[i].yaw\n",
    "        ud = u + (np.random.randn(1, 2) @ R).T  # add noise\n",
    "        px = motion_model(px, ud)\n",
    "        particles[i].x = px[0, 0]\n",
    "        particles[i].y = px[1, 0]\n",
    "        particles[i].yaw = px[2, 0]\n",
    "\n",
    "    return particles\n",
    "\n",
    "def pi_2_pi(angle):\n",
    "    return (angle + math.pi) % (2 * math.pi) - math.pi\n",
    "\n",
    "# END OF SNIPPET\n",
    "\n",
    "N_LM = 0 \n",
    "particles = [Particle(N_LM) for i in range(N_PARTICLE)]\n",
    "time= 0.0\n",
    "v = 1.0  # [m/s]\n",
    "yawrate = 0.1  # [rad/s]\n",
    "u = np.array([v, yawrate]).reshape(2, 1)\n",
    "history = []\n",
    "while SIM_TIME >= time:\n",
    "    time += DT\n",
    "    particles = predict_particles(particles, u)\n",
    "    history.append(deepcopy(particles))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "3f279cf1dcaf4ec886c01942c36e601d",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(IntSlider(value=0, description='t', max=499), Output()), _dom_classes=('widget-interact'…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# from IPython.html.widgets import *\n",
    "from ipywidgets import *\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "# playback the recorded motion of the particles\n",
    "def plot_particles(t=0):\n",
    "    x = []\n",
    "    y = []\n",
    "    for i in range(len(history[t])):\n",
    "        x.append(history[t][i].x)\n",
    "        y.append(history[t][i].y)\n",
    "    plt.figtext(0.15,0.82,'t = ' + str(t))\n",
    "    plt.plot(x, y, '.r')\n",
    "    plt.axis([-20,20, -5,25])\n",
    "\n",
    "interact(plot_particles, t=(0,len(history)-1,1));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2- Update\n",
    "\n",
    "For the update step it is useful to observe a single particle and the effect of getting a new measurements on the weight of the particle.\n",
    "\n",
    "As mentioned earlier, each particle maintains $N$ $2x2$ EKFs to estimate the landmarks, which includes the EKF process described in the EKF notebook. The difference is the change in the weight of the particle according to how likely the measurement is.\n",
    "\n",
    "The weight is updated according to the following equation: \n",
    "\n",
    "$\\begin{equation*}\n",
    "w_i = |2\\pi Q|^{\\frac{-1}{2}} exp\\{\\frac{-1}{2}(z_t - \\hat z_i)^T Q^{-1}(z_t-\\hat z_i)\\}\n",
    "\\end{equation*}$\n",
    "\n",
    "Where, $w_i$ is the computed weight, $Q$ is the measurement covariance, $z_t$ is the actual measurment and $\\hat z_i$ is the predicted measurement of particle $i$.\n",
    "\n",
    "To experiment this, a single particle is initialized then passed an initial measurement, which results in a relatively average weight. However, setting the particle coordinate to a wrong value to simulate wrong estimation will result in a very low weight. The lower the weight the less likely that this particle will be drawn during resampling and probably will die out."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "initial weight 1.0\n",
      "weight after landmark intialization 1.0\n",
      "weight after update  0.023098460073039763\n",
      "weight after wrong prediction 7.951154575772496e-07\n"
     ]
    }
   ],
   "source": [
    "# CODE SNIPPET #\n",
    "def observation(xTrue, xd, u, RFID):\n",
    "\n",
    "    # calc true state\n",
    "    xTrue = motion_model(xTrue, u)\n",
    "\n",
    "    # add noise to range observation\n",
    "    z = np.zeros((3, 0))\n",
    "    for i in range(len(RFID[:, 0])):\n",
    "\n",
    "        dx = RFID[i, 0] - xTrue[0, 0]\n",
    "        dy = RFID[i, 1] - xTrue[1, 0]\n",
    "        d = math.sqrt(dx**2 + dy**2)\n",
    "        angle = pi_2_pi(math.atan2(dy, dx) - xTrue[2, 0])\n",
    "        if d <= MAX_RANGE:\n",
    "            dn = d + np.random.randn() * Qsim[0, 0]  # add noise\n",
    "            anglen = angle + np.random.randn() * Qsim[1, 1]  # add noise\n",
    "            zi = np.array([dn, pi_2_pi(anglen), i]).reshape(3, 1)\n",
    "            z = np.hstack((z, zi))\n",
    "\n",
    "    # add noise to input\n",
    "    ud1 = u[0, 0] + np.random.randn() * Rsim[0, 0]\n",
    "    ud2 = u[1, 0] + np.random.randn() * Rsim[1, 1] + OFFSET_YAWRATE_NOISE\n",
    "    ud = np.array([ud1, ud2]).reshape(2, 1)\n",
    "\n",
    "    xd = motion_model(xd, ud)\n",
    "\n",
    "    return xTrue, z, xd, ud\n",
    "\n",
    "def update_with_observation(particles, z):\n",
    "    for iz in range(len(z[0, :])):\n",
    "\n",
    "        lmid = int(z[2, iz])\n",
    "\n",
    "        for ip in range(N_PARTICLE):\n",
    "            # new landmark\n",
    "            if abs(particles[ip].lm[lmid, 0]) <= 0.01:\n",
    "                particles[ip] = add_new_lm(particles[ip], z[:, iz], Q)\n",
    "            # known landmark\n",
    "            else:\n",
    "                w = compute_weight(particles[ip], z[:, iz], Q)\n",
    "                particles[ip].w *= w\n",
    "                particles[ip] = update_landmark(particles[ip], z[:, iz], Q)\n",
    "\n",
    "    return particles\n",
    "\n",
    "def compute_weight(particle, z, Q):\n",
    "    lm_id = int(z[2])\n",
    "    xf = np.array(particle.lm[lm_id, :]).reshape(2, 1)\n",
    "    Pf = np.array(particle.lmP[2 * lm_id:2 * lm_id + 2])\n",
    "    zp, Hv, Hf, Sf = compute_jacobians(particle, xf, Pf, Q)\n",
    "    dx = z[0:2].reshape(2, 1) - zp\n",
    "    dx[1, 0] = pi_2_pi(dx[1, 0])\n",
    "\n",
    "    try:\n",
    "        invS = np.linalg.inv(Sf)\n",
    "    except np.linalg.linalg.LinAlgError:\n",
    "        print(\"singuler\")\n",
    "        return 1.0\n",
    "\n",
    "    num = math.exp(-0.5 * dx.T @ invS @ dx)\n",
    "    den = 2.0 * math.pi * math.sqrt(np.linalg.det(Sf))\n",
    "    w = num / den\n",
    "\n",
    "    return w\n",
    "\n",
    "def compute_jacobians(particle, xf, Pf, Q):\n",
    "    dx = xf[0, 0] - particle.x\n",
    "    dy = xf[1, 0] - particle.y\n",
    "    d2 = dx**2 + dy**2\n",
    "    d = math.sqrt(d2)\n",
    "\n",
    "    zp = np.array(\n",
    "        [d, pi_2_pi(math.atan2(dy, dx) - particle.yaw)]).reshape(2, 1)\n",
    "\n",
    "    Hv = np.array([[-dx / d, -dy / d, 0.0],\n",
    "                   [dy / d2, -dx / d2, -1.0]])\n",
    "\n",
    "    Hf = np.array([[dx / d, dy / d],\n",
    "                   [-dy / d2, dx / d2]])\n",
    "\n",
    "    Sf = Hf @ Pf @ Hf.T + Q\n",
    "\n",
    "    return zp, Hv, Hf, Sf\n",
    "\n",
    "def add_new_lm(particle, z, Q):\n",
    "\n",
    "    r = z[0]\n",
    "    b = z[1]\n",
    "    lm_id = int(z[2])\n",
    "\n",
    "    s = math.sin(pi_2_pi(particle.yaw + b))\n",
    "    c = math.cos(pi_2_pi(particle.yaw + b))\n",
    "\n",
    "    particle.lm[lm_id, 0] = particle.x + r * c\n",
    "    particle.lm[lm_id, 1] = particle.y + r * s\n",
    "\n",
    "    # covariance\n",
    "    Gz = np.array([[c, -r * s],\n",
    "                   [s, r * c]])\n",
    "\n",
    "    particle.lmP[2 * lm_id:2 * lm_id + 2] = Gz @ Q @ Gz.T\n",
    "\n",
    "    return particle\n",
    "\n",
    "def update_KF_with_cholesky(xf, Pf, v, Q, Hf):\n",
    "    PHt = Pf @ Hf.T\n",
    "    S = Hf @ PHt + Q\n",
    "\n",
    "    S = (S + S.T) * 0.5\n",
    "    SChol = np.linalg.cholesky(S).T\n",
    "    SCholInv = np.linalg.inv(SChol)\n",
    "    W1 = PHt @ SCholInv\n",
    "    W = W1 @ SCholInv.T\n",
    "\n",
    "    x = xf + W @ v\n",
    "    P = Pf - W1 @ W1.T\n",
    "\n",
    "    return x, P\n",
    "\n",
    "def update_landmark(particle, z, Q):\n",
    "\n",
    "    lm_id = int(z[2])\n",
    "    xf = np.array(particle.lm[lm_id, :]).reshape(2, 1)\n",
    "    Pf = np.array(particle.lmP[2 * lm_id:2 * lm_id + 2, :])\n",
    "\n",
    "    zp, Hv, Hf, Sf = compute_jacobians(particle, xf, Pf, Q)\n",
    "\n",
    "    dz = z[0:2].reshape(2, 1) - zp\n",
    "    dz[1, 0] = pi_2_pi(dz[1, 0])\n",
    "\n",
    "    xf, Pf = update_KF_with_cholesky(xf, Pf, dz, Q, Hf)\n",
    "\n",
    "    particle.lm[lm_id, :] = xf.T\n",
    "    particle.lmP[2 * lm_id:2 * lm_id + 2, :] = Pf\n",
    "\n",
    "    return particle\n",
    "\n",
    "# END OF CODE SNIPPET #\n",
    "\n",
    "\n",
    "\n",
    "# Setting up the landmarks\n",
    "RFID = np.array([[10.0, -2.0],\n",
    "                [15.0, 10.0]])\n",
    "N_LM = RFID.shape[0]\n",
    "\n",
    "# Initialize 1 particle\n",
    "N_PARTICLE = 1\n",
    "particles = [Particle(N_LM) for i in range(N_PARTICLE)]\n",
    "\n",
    "xTrue = np.zeros((STATE_SIZE, 1))\n",
    "xDR = np.zeros((STATE_SIZE, 1))\n",
    "\n",
    "print(\"initial weight\", particles[0].w)\n",
    "\n",
    "xTrue, z, _, ud = observation(xTrue, xDR, u, RFID)\n",
    "# Initialize landmarks\n",
    "particles = update_with_observation(particles, z)\n",
    "print(\"weight after landmark intialization\", particles[0].w)\n",
    "particles = update_with_observation(particles, z)\n",
    "print(\"weight after update \", particles[0].w)\n",
    "\n",
    "particles[0].x = -10\n",
    "particles = update_with_observation(particles, z)\n",
    "print(\"weight after wrong prediction\", particles[0].w)\n",
    "        "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3- Resampling\n",
    "\n",
    "In the reseampling steps a new set of particles are chosen from the old set. This is done according to the weight of each particle. \n",
    "\n",
    "The figure shows 100 particles distributed uniformly between [-0.5, 0.5] with the weights of each particle distributed according to a Gaussian funciton. \n",
    "\n",
    "The resampling picks \n",
    "\n",
    "$i \\in 1,...,N$ particles with probability to pick particle with index $i ∝ \\omega_i$, where $\\omega_i$ is the weight of that particle\n",
    "\n",
    "\n",
    "To get the intuition of the resampling step we will look at a set of particles which are initialized with a given x location and weight. After the resampling the particles are more concetrated in the location where they had the highest weights. This is also indicated by the indices \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# CODE SNIPPET #\n",
    "def normalize_weight(particles):\n",
    "\n",
    "    sumw = sum([p.w for p in particles])\n",
    "\n",
    "    try:\n",
    "        for i in range(N_PARTICLE):\n",
    "            particles[i].w /= sumw\n",
    "    except ZeroDivisionError:\n",
    "        for i in range(N_PARTICLE):\n",
    "            particles[i].w = 1.0 / N_PARTICLE\n",
    "\n",
    "        return particles\n",
    "\n",
    "    return particles\n",
    "\n",
    "\n",
    "def resampling(particles):\n",
    "    \"\"\"\n",
    "    low variance re-sampling\n",
    "    \"\"\"\n",
    "\n",
    "    particles = normalize_weight(particles)\n",
    "\n",
    "    pw = []\n",
    "    for i in range(N_PARTICLE):\n",
    "        pw.append(particles[i].w)\n",
    "\n",
    "    pw = np.array(pw)\n",
    "\n",
    "    Neff = 1.0 / (pw @ pw.T)  # Effective particle number\n",
    "    # print(Neff)\n",
    "\n",
    "    if Neff < NTH:  # resampling\n",
    "        wcum = np.cumsum(pw)\n",
    "        base = np.cumsum(pw * 0.0 + 1 / N_PARTICLE) - 1 / N_PARTICLE\n",
    "        resampleid = base + np.random.rand(base.shape[0]) / N_PARTICLE\n",
    "\n",
    "        inds = []\n",
    "        ind = 0\n",
    "        for ip in range(N_PARTICLE):\n",
    "            while ((ind < wcum.shape[0] - 1) and (resampleid[ip] > wcum[ind])):\n",
    "                ind += 1\n",
    "            inds.append(ind)\n",
    "\n",
    "        tparticles = particles[:]\n",
    "        for i in range(len(inds)):\n",
    "            particles[i].x = tparticles[inds[i]].x\n",
    "            particles[i].y = tparticles[inds[i]].y\n",
    "            particles[i].yaw = tparticles[inds[i]].yaw\n",
    "            particles[i].w = 1.0 / N_PARTICLE\n",
    "\n",
    "    return particles, inds\n",
    "# END OF SNIPPET #\n",
    "\n",
    "\n",
    "\n",
    "def gaussian(x, mu, sig):\n",
    "    return np.exp(-np.power(x - mu, 2.) / (2 * np.power(sig, 2.)))\n",
    "N_PARTICLE = 100\n",
    "particles = [Particle(N_LM) for i in range(N_PARTICLE)]\n",
    "x_pos = []\n",
    "w = []\n",
    "for i in range(N_PARTICLE):\n",
    "    particles[i].x = np.linspace(-0.5,0.5,N_PARTICLE)[i]\n",
    "    x_pos.append(particles[i].x)\n",
    "    particles[i].w = gaussian(i, N_PARTICLE/2, N_PARTICLE/20)\n",
    "    w.append(particles[i].w)\n",
    "    \n",
    "\n",
    "# Normalize weights\n",
    "sw = sum(w)\n",
    "for i in range(N_PARTICLE):\n",
    "    w[i] /= sw\n",
    "\n",
    "particles, new_indices = resampling(particles)\n",
    "x_pos2 = []\n",
    "for i in range(N_PARTICLE):\n",
    "    x_pos2.append(particles[i].x)\n",
    "    \n",
    "# Plot results\n",
    "fig, ((ax1,ax2,ax3)) = plt.subplots(nrows=3, ncols=1)\n",
    "fig.tight_layout()\n",
    "ax1.plot(x_pos,np.ones((N_PARTICLE,1)), '.r', markersize=2)\n",
    "ax1.set_title(\"Particles before resampling\")\n",
    "ax1.axis((-1, 1, 0, 2))\n",
    "ax2.plot(w)\n",
    "ax2.set_title(\"Weights distribution\")\n",
    "ax3.plot(x_pos2,np.ones((N_PARTICLE,1)), '.r')\n",
    "ax3.set_title(\"Particles after resampling\")\n",
    "ax3.axis((-1, 1, 0, 2))\n",
    "fig.subplots_adjust(hspace=0.8)\n",
    "plt.show()\n",
    "\n",
    "plt.figure()\n",
    "plt.hist(new_indices)\n",
    "plt.xlabel(\"Particles indices to be resampled\")\n",
    "plt.ylabel(\"# of time index is used\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### References\n",
    "\n",
    "http://www.probabilistic-robotics.org/\n",
    "\n",
    "http://ais.informatik.uni-freiburg.de/teaching/ws12/mapping/pdf/slam10-fastslam.pdf"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
